package com.school.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 统一获取前端提交的JSON格式的数据
 * 并使用FastJSON来装换成普通的List集合
 */
public class RequestJsonUtil {

    private static String field = "list";

    /**
     * 读取JSON格式的数据，并且转换成List对象
     *
     * @param req   ~
     * @param clazz 需要转换成List存储的对象的class
     * @param <T>   List存储的对象
     * @return list集合
     */
    public static <T> List<T> read(HttpServletRequest req, Class clazz) {
        try {
            req.setCharacterEncoding("UTF-8");
            // 读取JSON格式的数据
            BufferedReader reader = new BufferedReader(req.getReader());
            StringBuffer sb = new StringBuffer();
            String temp = null;
            while ((temp = reader.readLine()) != null) {
                sb.append(temp);
            }
            // 转换成JSONObject对象
            JSONObject jsonObject = JSONObject.parseObject(sb.toString());
            // 提取JSONObject对象中list字段
            JSONArray jsonArray = jsonObject.getJSONArray(field);
            // 将list字段转换成字符串，再使用JSONArray将字符串转换成List集合
            List<T> objects = (List<T>) JSONArray.parseArray(jsonArray.toJSONString(), clazz);
            // 返回集合
            return objects;
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 如果出错返回空集合，避免控制在错误
        return new ArrayList<>(0);
    }

    /**
     * 读取JSON格式的数据，并且转换成List对象
     *
     * @param req   ~
     * @param clazz 需要转换成List存储的对象的class
     * @param <T>   List存储的对象
     * @return list集合
     */
    public static <T> List<T> read(HttpServletRequest req,String key, Class clazz) {
        try {
            req.setCharacterEncoding("UTF-8");
            // 读取JSON格式的数据
            BufferedReader reader = new BufferedReader(req.getReader());
            StringBuffer sb = new StringBuffer();
            String temp = null;
            while ((temp = reader.readLine()) != null) {
                sb.append(temp);
            }
            // 转换成JSONObject对象
            JSONObject jsonObject = JSONObject.parseObject(sb.toString());
            // 提取JSONObject对象中list字段
            JSONArray jsonArray = jsonObject.getJSONArray(key);
            // 将list字段转换成字符串，再使用JSONArray将字符串转换成List集合
            List<T> objects = (List<T>) JSONArray.parseArray(jsonArray.toJSONString(), clazz);
            // 返回集合
            return objects;
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 如果出错返回空集合，避免控制在错误
        return new ArrayList<>(0);
    }


    /**
     * 读取JSON格式的数据，并且转换成List对象
     *
     * @param req   ~
     * @param clazz 需要转换成List存储的对象的class
     * @param <T>   List存储的对象
     * @return list集合
     */
    public static <T> T readObject(HttpServletRequest req, Class<T> clazz) {
        try {
            req.setCharacterEncoding("UTF-8");
            // 读取JSON格式的数据
            BufferedReader reader = new BufferedReader(req.getReader());
            StringBuffer sb = new StringBuffer();
            String temp = null;
            while ((temp = reader.readLine()) != null) {
                sb.append(temp);
            }
            // 转换成JSONObject对象
            T t = JSONObject.parseObject(sb.toString(), clazz);
            return t;
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 如果出错返回空集合，避免控制在错误
        return null;
    }
}
